00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 require_once('iface.userdataprovider.inc.php');
00027 require_once(PATH_TO_ROOT.'courses/classes/class.Course.inc.php');
00028
00034 class UserData {
00035
00036 private $userID;
00037
00038 private $meta;
00039
00040 private $data;
00041
00042
00043 function __construct($userID) {
00044 $this->userID = $userID;
00045 $this->data = null;
00046 $this->meta = null;
00047 }
00048
00054 public function getMetaData() {
00055 if ($this->meta !== null) {
00056 return $this->meta;
00057 }
00058
00059 $this->getUserData();
00060
00061 return $this->meta;
00062 }
00063
00069 public function getUserData() {
00070 if ($this->data !== null) {
00071 return $this->data;
00072 }
00073
00074 $this->data = array();
00075 $this->getModules();
00076
00077 foreach ($this->meta[UserDataProvider::MODULE] as $module) {
00078 require_once PATH_TO_ROOT.$module['script'];
00079 $class = new $module['class'];
00080
00081
00082 if (in_array('UserDataProvider', class_implements($class))) {
00083 $data = $class->getUserData($this->userID);
00084
00085 if (count($data) > 0) {
00086 foreach ($data as $key => $temp) {
00087 $data[$key][UserDataProvider::ID] = intval($temp[UserDataProvider::ID]);
00088 $data[$key][UserDataProvider::DATE] = intval($temp[UserDataProvider::DATE]);
00089 $data[$key][UserDataProvider::MODULE] = $module[UserDataProvider::ID];
00090
00091 $this->data[] = $data[$key];
00092 }
00093 }
00094 } else {
00095
00096 echo 'Die Klasse: '.$module['class'].' implementiert die Schnittstelle: UserDataProvider nicht!';
00097 }
00098 }
00099
00100
00101 $this->getCourses();
00102 $this->sortData();
00103
00104 return $this->data;
00105 }
00106
00110 private function getModules() {
00111 global $db;
00112
00113 $this->meta[UserDataProvider::MODULE] = array();
00114 if ($modules = $db->get_results('SELECT id, script, class, name FROM userdata_modules ORDER BY name', ARRAY_A)) {
00115 foreach ($modules as $key => $module) {
00116
00117 $moduleID = intval($module[UserDataProvider::ID]);
00118 $this->meta[UserDataProvider::MODULE][$moduleID] = $module;
00119 $this->meta[UserDataProvider::MODULE][$moduleID][UserDataProvider::ID] = $moduleID;
00120 }
00121 }
00122 }
00123
00127 private function getCourses() {
00128 global $db;
00129
00130 $this->meta[UserDataProvider::COURSE] = array();
00131 foreach ($this->getUserData() as $key => $data) {
00132
00133 $courseID = intval($data[UserDataProvider::COURSE]);
00134 $this->data[$key][UserDataProvider::COURSE] = $courseID;
00135
00136 if (! isset($this->meta[UserDataProvider::COURSE][$courseID])) {
00137 if($result = $db->get_row('SELECT Name as name, closed, Semester as semester FROM courses WHERE ID='.$courseID, ARRAY_A)) {
00138 $this->meta[UserDataProvider::COURSE][$courseID] = array(
00139 'name' => $result['name'].' ('.Course::semesterDBtoString($result['semester']).')',
00140 UserDataProvider::CLOSED => (boolean) $result[UserDataProvider::CLOSED],
00141 UserDataProvider::POLICY => (boolean) $db->get_var('SELECT count(*) FROM course_policy WHERE course_id='.$courseID)
00142 );
00143 } else {
00144 $this->meta[UserDataProvider::COURSE][$courseID] = array(
00145 'name' => ' Unbekannter Kurs ('.$courseID.')',
00146 UserDataProvider::CLOSED => (boolean) true,
00147 UserDataProvider::POLICY => (boolean) false
00148 );
00149 }
00150 }
00151 asort($this->meta[UserDataProvider::COURSE]);
00152 $this->meta[UserDataProvider::COURSE][0] = array('name' => 'Foyer', UserDataProvider::CLOSED => false, UserDataProvider::POLICY => false);
00153 }
00154 }
00155
00161 private function sortData() {
00162 return usort($this->data, array($this, 'courseTransformation'));
00163 }
00164
00172 private function courseTransformation($a, $b) {
00173
00174 if ($a[UserDataProvider::COURSE] === 0 && $b[UserDataProvider::COURSE] !== 0) {
00175 return -1;
00176 } else if ($a[UserDataProvider::COURSE] !== 0 && $b[UserDataProvider::COURSE] === 0) {
00177 return 1;
00178 }
00179
00180
00181 $result = 0;
00182 if ($a[UserDataProvider::COURSE] !== 0 && $b[UserDataProvider::COURSE] !== 0) {
00183 $result = strcmp(
00184 $this->meta[UserDataProvider::COURSE][$a[UserDataProvider::COURSE]]['name'],
00185 $this->meta[UserDataProvider::COURSE][$b[UserDataProvider::COURSE]]['name']
00186 );
00187 }
00188
00189
00190 if($result === 0) {
00191 $result = strcmp(
00192 $this->meta[UserDataProvider::MODULE][$a[UserDataProvider::MODULE]]['name'],
00193 $this->meta[UserDataProvider::MODULE][$b[UserDataProvider::MODULE]]['name']
00194 );
00195 }
00196
00197
00198 if($result === 0) {
00199 $result = strcmp(
00200 substr($a[UserDataProvider::HINT], -strpos($a[UserDataProvider::HINT], '\n')),
00201 substr($b[UserDataProvider::HINT], -strpos($b[UserDataProvider::HINT], '\n'))
00202 );
00203 }
00204
00205
00206 if($result === 0) {
00207 $result = strcmp(
00208 $a[UserDataProvider::DATE],
00209 $b[UserDataProvider::DATE]
00210 );
00211 }
00212
00213 return $result;
00214 }
00215
00216 }
00217 ?>